/**
 * @file ros_control_driver.h
 * @author circleup (circleup@foxmail.com)
 * @brief 串口数据处理，下位机控制函数
 * @version 2.5
 * @date 2020-07-01
 * 
 * @copyright Copyright (c) 2020
 * 
 */

#ifndef _ROS_CONTROL_DRIVER_H_
#define _ROS_CONTROL_DRIVER_H_

#include "ros_car/VCU_frame.h"
#include "ros_car/car_status_frame.h"

#define PI 3.14159265358979323846

/**
 * @brief GPS 数据转存变量
 * 
 */
extern ros_car::car_status_frame serial_msg;

/**
 * @brief 设置下位机 CAN 协议结构体默认值
 * 
 * @param dest_value 发送数据结构体指针
 */
void SetVCUDefaultValue(ros_car::VCU_frame *dest_value);

/**
 * @brief 油门设置
 * 
 * @param dest_value 发送数据结构体指针
 * @param src_value 油门值
 */
void SetVCUPedValue(ros_car::VCU_frame *dest_value, uint8_t src_value);

/**
 * @brief 转向角度设置
 * 
 * @param dest_value 发送数据结构体指针
 * @param src_value 角度值
 */
void SetVCUSTRAngleValue(ros_car::VCU_frame *dest_value, int16_t src_value);

/**
 * @brief 刹车值设置
 * 
 * @param dest_value 发送数据结构体指针
 * @param src_value 刹车值
 */
void SetVCUBreakValue(ros_car::VCU_frame *dest_value, uint8_t src_value);

/**
 * @brief 档位设置
 * 
 * @param dest_value 发送数据结构体指针
 * @param src_value 档位
 */
void SetVCUGearValue(ros_car::VCU_frame *dest_value, uint8_t src_value);

/**
 * @brief 获取两点的距离，在椭球面上的距离
 * 
 * @param lat1 1点纬度
 * @param lon1 1点经度
 * @param lat2 2点纬度
 * @param lon2 2点经度
 * @return double 
 * @details 获取两点的距离，
 * 参考网站： http://www.movable-type.co.uk/scripts/latlong-vincenty.html
 */
double GetDistance(double lat1, double lon1, double lat2, double lon2);

/**
 * @brief GPS 坐标转 UTM 坐标系
 * 
 * @param longitude 经度
 * @param latitude 纬度
 * @param UTME UTM 坐标系 x 轴
 * @param UTMN UTM 坐标系 y 轴
 * @details GPS 坐标转 UTM 坐标系
 * 验证网页：http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html
 */
void LonLat2UTM(double longitude, double latitude, double& UTME, double& UTMN);

/**
 * @brief 获取两个 UTM 坐标的角度（正北为极轴，顺时针为正方向）
 * 
 * @param UTME1 1 点 x 坐标
 * @param UTMN1 1 点 y 坐标
 * @param UTME2 2 点 x 坐标
 * @param UTMN2 2 点 y 坐标
 * @return double 角度制，与 GPS 发送的航向角相匹配（正北为极轴，顺时针为正方向）
 */
double GPSAngleCalculateUTM(double& UTME1, double& UTMN1, double& UTME2, double& UTMN2);

/**
 * @brief 获取两个 GPS 坐标的角度（正北为极轴，顺时针为正方向）
 * 
 * @param longitude1 1点经度
 * @param latitude1 1点纬度
 * @param longitude2 2点经度
 * @param latitude2 2点纬度
 * @return double 角度制，与 GPS 发送的航向角相匹配（正北为极轴，顺时针为正方向）
 */
double GPSAngleCalculateUTMFromGPS(double longitude1, double latitude1, double longitude2, double latitude2);

/**
 * @brief 获取距离（UTM 坐标系）
 * 
 * @param UTME1 1 点 x 坐标
 * @param UTMN1 1 点 y 坐标
 * @param UTME2 2 点 x 坐标
 * @param UTMN2 2 点 y 坐标
 * @return double 两点距离（UTM 坐标）
 */
double GetDistanceUTM(double UTME1, double UTMN1, double UTME2, double UTMN2);

/**
 * @brief 获取距离（UTM 坐标系）
 * 
 * @param longitude1 1点经度
 * @param latitude1 1点纬度
 * @param longitude2 2点经度
 * @param latitude2 2点纬度
 * @return double 
 */
double GetDistanceUTMFromGPS(double longitude1, double latitude1, double longitude2, double latitude2);
#endif